Chi nhánh Git
Làm việc với các nhánh Git
Trong Git, một branch
là phiên bản mới/riêng biệt của kho lưu trữ chính.
Giả sử bạn có một dự án lớn và bạn cần cập nhật thiết kế trên đó.
Nó sẽ hoạt động như thế nào nếu không có và có Git:
Không có Git:
- Tạo bản sao của tất cả các tệp có liên quan để tránh ảnh hưởng đến phiên bản trực tiếp
- Bắt đầu làm việc với thiết kế và nhận thấy mã đó phụ thuộc vào mã trong các tệp khác, mã này cũng cần được thay đổi!
- Tạo bản sao của các tập tin phụ thuộc. Đảm bảo rằng mọi phụ thuộc tệp đều tham chiếu đúng tên tệp
- KHẨN CẤP! Có một lỗi không liên quan ở đâu đó khác trong dự án cần được sửa càng sớm càng tốt!
- Lưu tất cả các tệp của bạn, ghi chú tên của các bản sao bạn đang làm việc
- Xử lý lỗi không liên quan và cập nhật mã để sửa nó
- Quay lại thiết kế và hoàn thành công việc ở đó
- Sao chép mã hoặc đổi tên tệp để thiết kế cập nhật có trên phiên bản trực tiếp
- (2 tuần sau bạn nhận ra lỗi không liên quan chưa được sửa ở bản thiết kế mới vì bạn đã chép file trước khi sửa)
Với Git:
- Với nhánh mới tên là new-design, chỉnh sửa code trực tiếp mà không ảnh hưởng tới nhánh chính
- KHẨN CẤP! Có một lỗi không liên quan ở đâu đó khác trong dự án cần được sửa càng sớm càng tốt!
- Tạo một nhánh mới từ dự án chính có tên là sửa lỗi nhỏ
- Sửa lỗi không liên quan và gộp nhánh sửa lỗi nhỏ với nhánh chính
- Bạn quay lại nhánh thiết kế mới và hoàn thành công việc ở đó
- Hợp nhất nhánh thiết kế mới với nhánh chính (được cảnh báo về việc sửa lỗi nhỏ mà bạn đang thiếu)
Các nhánh cho phép bạn làm việc trên các phần khác nhau của dự án mà không ảnh hưởng đến nhánh chính.
Khi công việc hoàn thành, một nhánh có thể được sáp nhập với dự án chính.
Bạn thậm chí có thể chuyển đổi giữa các nhánh và làm việc trên các dự án khác nhau mà không gây ảnh hưởng lẫn nhau.
Phân nhánh trong Git rất nhẹ và nhanh chóng!
Chi nhánh Git mới
Hãy thêm một số tính năng mới vào trang index.html
của chúng tôi.
Chúng tôi đang làm việc trong kho lưu trữ cục bộ của mình và chúng tôi không muốn làm phiền hoặc có thể phá hỏng dự án chính.
Vì vậy, chúng tôi tạo một branch
mới:
Ví dụ
git branch hello-world-images
Bây giờ chúng tôi đã tạo một branch
mới gọi là " hello-world-images
"
Hãy xác nhận rằng chúng tôi đã tạo một branch
mới:
Ví dụ
git branch hello-world-images * master
Chúng ta có thể thấy nhánh mới có tên "hello-world-image", nhưng dấu *
bên cạnh master
chỉ rõ rằng chúng ta hiện đang ở trên branch
đó.
checkout
là lệnh được sử dụng để kiểm tra một branch
. Di chuyển chúng ta từ branch
hiện tại đến nhánh được chỉ định ở cuối lệnh:
Ví dụ
git checkout hello-world-images Switched to branch 'hello-world-images'
Bây giờ chúng tôi đã chuyển không gian làm việc hiện tại của mình từ nhánh chính sang branch
mới
Mở trình chỉnh sửa yêu thích của bạn và thực hiện một số thay đổi.
Trong ví dụ này, chúng tôi đã thêm một hình ảnh (img_hello_world.jpg) vào thư mục đang làm việc và một dòng mã trong tệp index.html
:
Ví dụ
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link
rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello
world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from
Space"
style="width:100%;max-width:960px"></div>
<p>This is the first
file in my new Git Repo.</p>
<p>A new line in our file!</p>
</body>
</html>
Chúng tôi đã thực hiện các thay đổi đối với một tệp và thêm một tệp mới vào thư mục làm việc (cùng thư mục với branch
main
).
Bây giờ hãy kiểm tra trạng thái của branch
hiện tại:
Ví dụ
git status On branch hello-world-images Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.html Untracked files: (use "git add <file>..." to include in what will be committed) img_hello_world.jpg no changes added to commit (use "git add" and/or "git commit -a")
Vì vậy, hãy xem qua những gì xảy ra ở đây:
- Có những thay đổi đối với chỉ mục.html của chúng tôi, nhưng tệp không được phân loại để
commit
-
img_hello_world.jpg
không đượctracked
Vì vậy, chúng ta cần thêm cả hai tệp vào Môi trường dàn dựng cho branch
này:
Ví dụ
git add --all
Việc sử dụng --all
thay vì tên tệp riêng lẻ sẽ Giai đoạn tất cả các tệp đã thay đổi (mới, sửa đổi và xóa).
Kiểm tra status
của branch
:
Ví dụ
git status On branch hello-world-images Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: img_hello_world.jpg modified: index.html
Chúng tôi hài lòng với những thay đổi của chúng tôi. Vì vậy, chúng tôi sẽ cam kết chúng với branch
:
Ví dụ
git commit -m "Added image to Hello World" [hello-world-images 0312c55] Added image to Hello World 2 files changed, 1 insertion(+) create mode 100644 img_hello_world.jpg
Bây giờ chúng ta có một branch
mới, khác với branch
chính.
Lưu ý: Sử dụng tùy chọn -b
khi checkout
sẽ tạo một nhánh mới và chuyển đến nhánh đó nếu nó không tồn tại
Chuyển đổi giữa các chi nhánh
Bây giờ chúng ta hãy xem việc làm việc với các nhánh khác nhau nhanh chóng và dễ dàng như thế nào cũng như nó hoạt động tốt như thế nào.
Chúng tôi hiện đang ở chi nhánh hello-world-images
. Chúng tôi đã thêm một hình ảnh vào nhánh này, vì vậy hãy liệt kê các tệp trong thư mục hiện tại:
Ví dụ
ls README.md bluestyle.css img_hello_world.jpg index.html
Chúng ta có thể thấy tệp mới img_hello_world.jpg
và nếu mở tệp html, chúng ta có thể thấy mã đã bị thay đổi. Tất cả đều như nó phải vậy.
Bây giờ hãy xem điều gì xảy ra khi chúng ta thay đổi nhánh thành master
Ví dụ
git checkout master Switched to branch 'master'
Hình ảnh mới không phải là một phần của nhánh này. Liệt kê lại các tập tin trong thư mục hiện tại:
Ví dụ
ls README.md bluestyle.css index.html
img_hello_world.jpg
không còn ở đó nữa! Và nếu chúng ta mở tệp html, chúng ta có thể thấy mã được hoàn nguyên về trạng thái trước khi thay đổi.
Bạn có thấy làm việc với các nhánh dễ dàng như thế nào không? Và làm thế nào điều này cho phép bạn làm việc trên những thứ khác nhau?
Chi nhánh khẩn cấp
Bây giờ hãy tưởng tượng rằng chúng ta vẫn chưa hoàn thành xong với hello-world-images, nhưng chúng ta cần sửa lỗi trên master.
Tôi không muốn gây rối trực tiếp với chủ nhân và tôi không muốn gây rối với hình ảnh xin chào thế giới, vì nó vẫn chưa hoàn thành.
Vì vậy, chúng tôi tạo một nhánh mới để giải quyết trường hợp khẩn cấp:
Ví dụ
git checkout -b emergency-fix Switched to a new branch 'emergency-fix'
Bây giờ chúng ta đã tạo một nhánh mới từ master và thay đổi thành nhánh đó. Chúng ta có thể yên tâm sửa lỗi mà không làm ảnh hưởng đến các nhánh khác.
Hãy sửa lỗi tưởng tượng của chúng tôi:
Ví dụ
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link
rel="stylesheet" href="bluestyle.css">
</head>
<body>
<h1>Hello
world!</h1>
<p>This is the first
file in my new Git Repo.</p>
<p>This line is here to show how
merging works.</p>
</body>
</html>
Chúng tôi đã thực hiện các thay đổi trong tệp này và chúng tôi cần đưa những thay đổi đó vào nhánh chính.
Kiểm tra trạng thái:
Ví dụ
git status On branch emergency-fix Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.html no changes added to commit (use "git add" and/or "git commit -a")
giai đoạn tập tin và cam kết:
Ví dụ
git add index.html git commit -m "updated index.html with emergency fix" [emergency-fix dfa79db] updated index.html with emergency fix 1 file changed, 1 insertion(+), 1 deletion(-)
Bây giờ chúng tôi đã có bản sửa lỗi sẵn sàng cho bản chính và chúng tôi cần hợp nhất hai nhánh.